import cv2
import matplotlib.pyplot as plt
import numpy as np

#image reading from file
img_ori = cv2.imread('lenna.jpg', 1) #1是彩色图 0是黑白图
#print (img_ori.shape)#查看数组情况，三维数组，三个通道

img_gray = cv2.imread('lenna.jpg', 0)
#print (img_ori.shape)

#显示图片
# cv2.imshow('lenna', img_ori)
# key = cv2.waitKey() #等待防止opencv卡死
# if key == 27: #27指esc键
#     cv2.destroyAllWindows()

#显示图片，
plt.imshow(img_ori)
#plt.show()

#设置显示图片的模式
plt.imshow(cv2.cvtColor(img_ori, cv2.COLOR_BGR2RGB))
#plt.show()

#图片变小 并以灰度图显示
plt.figure(figsize=(2,2))
plt.imshow(img_gray,cmap='gray')
#plt.show()

#显示多张图 121是指一行两列的第一个
plt.subplot(121)
#plt.imshow(img_ori)
plt.subplot(122)
plt.imshow(cv2.cvtColor(img_ori, cv2.COLOR_BGR2RGB))
#plt.show()


def my_show(img,size=(2,2)):
    plt.figure(figsize=size)
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.show()

#my_show(img_ori)

#image crop 图像剪切 只显示一部分
img_crop = img_ori[50:300,100:300]
#my_show(img_crop)




#channel split通道分割，分成蓝绿红三个通道
B,G,R = cv2.split(img_ori)
# cv2.imshow('B', B)
# cv2.imshow('G', G)
# cv2.imshow('R', R)
# key = cv2.waitKey()
# if key == 27:
#     cv2.destroyAllWindows()

#对每个通道进行处理，加深各个通道对颜色
def img_cooler(img,b_increase,r_decrease):
    B,G,R = cv2.split(img)#对通道进行分割，并对每个通道进行处理
    b_lim = 255 - b_increase
    B[B > b_lim] = 255
    B[B <= b_lim] = (b_increase + B[B <= b_lim]).astype(img.dtype)
    r_lim = r_decrease
    R[R < r_lim] = 0
    R[R >= r_lim] = (R[R >= r_lim] - r_decrease).astype(img.dtype)
    return cv2.merge((B,G,R))

#色温
img_cool = img_cooler(img_ori,10,10)
#my_show(img_cool)





#Gamma 变换，调整不同通道对灰度值
img_dark = cv2.imread('dark.jpg')
#my_show(img_dark,size=(6,6))

def adjust_gamma(image, gamma=1.0):
    invGamma = 1.0/gamma
    table = []
    for i in range(256):
        table.append(((i / 255.0) ** invGamma) * 255)#归一化之后做幂指数变换
    table = np.array(table).astype("uint8")
    return cv2.LUT(img_dark, table)

#通过gamma函数将黑色图变亮
img_brighter = adjust_gamma(img_dark,2)
#my_show(img_brighter,size=(6,6))

#直方图均衡
plt.hist(img_brighter.flatten(), 256, [0, 256], color = 'r')
#plt.show()


#transform 变换
# M = cv2.getRotationMatrix2D((img_ori.shape[1] / 2, img_ori.shape[0] / 2), 30, 1) # center, angle, scale
# img_rotate = cv2.warpAffine(img_ori, M, (img_ori.shape[1], img_ori.shape[0]))
# my_show(img_rotate)

# Affine Transform
#仿射变换在图形中的变换包括：平移、缩放、旋转、斜切及它们的组合形式。这些变换的特点是：平行关系和线段的长度比例保持不变。
rows, cols, ch = img_ori.shape
pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
pts2 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.7, rows * 0.2], [cols * 0.1, rows * 0.9]])

M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img_ori, M, (cols, rows))
#my_show(dst)

# perspective transform
#投影变换是4个点对之间变换
pts1 = np.float32([[0,0],[0,500],[500,0],[500,500]])
pts2 = np.float32([[5,19],[19,460],[460,9],[410,420]])
#此时，有一个投影矩阵是从这两个点对之间变过来的
M = cv2.getPerspectiveTransform(pts1,pts2)
#print(M)
#得到M之后，就可以用M对图片进行投影变换
#参数分别是原图，M矩阵，长宽，
img_wrap = cv2.warpPerspective(img_ori,M,(500,500))
#my_show(img_wrap)
'''

#膨胀和腐蚀 只能处理黑白图
# img_writing = cv2.imread('libai.png',0)
# plt.figure(figsize=(8,6))
# plt.imshow(img_writing,cmap='gray')
#plt.show()
#腐蚀操作  只迭代一次 把白色的区域腐蚀(缩小)
erode_writing = cv2.erode(img_writing,None,iterations=1)
plt.figure(figsize=(8,6))
plt.imshow(erode_writing,cmap='gray')
#plt.show()

#膨胀操作, 把白色对区域变大
dilate_writing = cv2.dilate(img_writing,None,iterations=1)
plt.figure(figsize=(8,6))
plt.imshow(dilate_writing,cmap='gray')
plt.show()


'''







